define(function(require, exports, module) {
	// 设置 .imgContainter.noImg、img.loading
	// 属性 data-lazyload=图片源

	/*
	<img data-lazyload="{screenshotURL}" class="loading" />
	CSS:
				img{
					width: 100%;
					.imgOpacityShow;
					&.loading{
						opacity: 0;
					}
				}

	<!-- 
	异步加载图片
		<div class="img noImg">
			<a href="#">
				<img class="loading" data-lazyload="http://192.168.1.92/bigfoot/yuetv_temp/8.jpg" />
				<h4>
					<div>
						<div class="tvSer"></div>欧冠：皇马胜拜仁
					</div>
				</h4>
			</a>
		</div>	
	 -->
	*/
	var lazyImgs = {
		init : function(imgs){
			this.imgArr = [];
			var imgArr = this.imgArr;
			imgs(function(img){
				img.onload = afterImgLoad;
				// img.src = img.getAttribute('data-lazyload');
				imgArr.push(img);
			});
			window.addEventListener('scroll', loadImg.bind(this));
			loadImg.call(this);
		}
	};

	function afterImgLoad(e){
		var img = e.target;
		if(img.parentNode)img.parentNode.removeCls('noImg');
		var up = img.up(null, 'noImg');
		// debugger;
		up && up.removeCls('noImg');
		img.removeCls('loading');
	}

	function loadImg(){
		var arr = this.imgArr;
		var scrollTop = document.body.scrollTop, docHeight = window.innerHeight;
		
		for(var img, i = 0, j = arr.length; i < j; i++){
			img = arr[i];
			var imgTop = img.getBoundingClientRect().top, // 图片元素到 doc 顶端的距离
				isFirstPage = scrollTop == 0 && docHeight > imgTop, // 启动页面就显示的图片，立刻加载
				isInPage = scrollTop > imgTop;
			
			if((isFirstPage || isInPage) && !img.src){

					img.src = img.getAttribute('data-lazyload');
			}
		}
		//@todo 如果全部已加载完毕，清除 windows.scroll 事件
	}
	exports.lazyImgs = lazyImgs;

	var handlers = [], inited = false;
	exports.onBlockScrollShow = function(el, fn){
		handlers.push(fn);
		if(!inited){
			window.addEventListener('scroll', function(){
				var scrollTop = document.body.scrollTop, docHeight = window.innerHeight;

				var elTop = el.getBoundingClientRect().top, // 图片元素到 doc 顶端的距离
					isFirstPage = scrollTop == 0 && docHeight > elTop, // 启动页面就显示的图片，立刻加载
					isInPage = scrollTop > elTop;
				
				if(isFirstPage || isInPage){
						// debugger;
					for(var i = 0, j = handlers.length; i < j; i++){
						handlers[i]();
					}
					handlers = [];
					handlers.length = 0; // 不要重复执行
					window.removeEventListener('scroll', arguments.callee);
				}

			});	
			inited = true;		
		}
	}
	
 	/*----------------------------------------------------------------
    				          悬浮面板
    -----------------------------------------------------------------*/
	// 滚动元素必须在 doc.body 根下面；手动输入 body el 之 宽度，通常为 980；可设置 左右
	// 如果在右边 推荐在 css 中定义 right，以免跳动
    var sideFloat = {
    	bodyWidth : 980,// 内容宽度
    	el : null,
    	side : 'left', // or 'left'
    	offset : 0, // 适当的偏移
    	init: function(){
			var elStyle = this.el.style, elWidth = this.el.clientWidth, offset;

			offset = window.innerWidth / 2 - this.bodyWidth / 2  - elWidth;
			offset = offset - (this.side == 'left' ? 5: 13);
			elStyle[this.side] = offset + 'px';

			//优化  
			var i = 0, docEl = document.documentElement, body = document.body, _offset = this.offset;
	        (function(){  
	            var me = arguments.callee;  
	            window.addEventListener('scroll', function(){  
	                i += 1;  

	                window.removeEventListener('scroll', arguments.callee);  
	                window.setTimeout(function(){  
	                	var scrollTop = (docEl && docEl.scrollTop) || body.scrollTop;
			    		elStyle.top = (scrollTop  + window.innerHeight / 2 - _offset) +'px';
	                    me();  
	                }, 300); //300毫秒执行一次  
	            });  
	        })(); 
    	}
    };
    exports.sideFloat = sideFloat;

   /**
     * 回到页面顶部（高度比较短的时候貌似不起作用）
     * @param acceleration 加速度
     * @param time 时间间隔 (毫秒)
     **/
    function goTop(acceleration, time) {
        acceleration = acceleration || 0.1;
        time = time || 16;

        var x1 = y1 = x2 = y2 = x3 = y3 = 0;

        if (document.documentElement) 
            x1 = document.documentElement.scrollLeft || 0, y1 = document.documentElement.scrollTop || 0;
        
        if (document.body) 
            x2 = document.body.scrollLeft || 0, y2 = document.body.scrollTop || 0;
        
        x3 = window.scrollX || 0, y3 = window.scrollY || 0;

        // 滚动条到页面顶部的水平距离
        var x = Math.max(x1, Math.max(x2, x3));
        // 滚动条到页面顶部的垂直距离
        var y = Math.max(y1, Math.max(y2, y3));

        // 滚动距离 = 目前距离 / 速度, 因为距离原来越小, 速度是大于 1 的数, 所以滚动距离会越来越小
        var speed = 1 + acceleration;
        window.scrollTo(Math.floor(x / speed), Math.floor(y / speed));

        // 如果距离不为零, 继续调用迭代本函数
        if (x > 0 || y > 0) {
            var invokeFunction = "exports.goTop(" + acceleration + ", " + time + ")";
            window.setTimeout(function(){
            	goTop(acceleration, time);
            }, time);
        }
    }

    exports.goTop = goTop;
	
	exports.cookies = {
		/**
		 * 读取Cookie
		 * @param	{String} Name
		 * @return	{String}
		 */
		get : (function(key){
			var arr = document.cookie.match(new RegExp("(?:;.)?" + key + "=([^;]*);?"));
			return arr && unescape(arr[1]);
		})//.after($$.getPrimitives)
		
		/**
		 * 设置Cookies
		 * if the expires variable is set, make the correct expires time, the current script below will set it for x number of days, to make it for hours, delete * 24, for minutes, delete * 60 * 24
		 * @param {String}	name
		 * @param {Mixed}	value 
		 * @param {Number}	expireDays 过期天数
		 * @return value
		 */
		,set : function (key, value, expires, path, domain, secure){
			var cookie = [key + "=" + escape(value)];

			if  (expires){
				 expires = expires * 1000 * 60 * 60 * 24
				,expires = new Date(new Date().getTime() + expires)
				,expires = expires.toGMTString();
				
				cookie.push('expires='	+ expires);
			}

			path	&& cookie.push('path='	 + path);
			domain	&& cookie.push('domain=' + domain);
			secure	&& cookie.push('secure');
			
			document.cookie = cookie.join('; ');
			
			return value;
		}
		
		/**
		 * 删掉 Cookie。
		 * @param {String} key Cookie 之 ID。
		 */
		,del : function(key){
			document.cookie = key + '=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
		}
		
		/**
		 * 怎样使用Cookie跟踪来访者？
		 * 看看下面的代码，我们用它来持续跟踪一个用户，以获知用户访问过多少次网站页面。
		 * 其中，“edk_visited_user”就是我们cookie的默认标识。
		 * @return {Number} 第几次访问。
		 */
//		,visitCounter : function(){
//			var key = 'edk_visited_user';
//			var i	= this.get(key);
//			
//			return this.set(key, i ? ++(Number(i)) : 1/* 第一次访问，没有设置过cookies */, 99, '/');
//		}
	};

	
	/**
	 * 送入选中的元素，然后反选其他（其他兄弟）
	 * @param  {[type]} selectEl [description]
	 * @return {[type]}          [description]
	 */
	function selectable(selectEl){
		var ul = selectEl.parentNode;
		var item;
		for(var i = 0, j = ul.children.length; i < j; i++){
			item = ul.children[i];
			if(item == selectEl){
				selectEl.className += ' selected';
			}else{
				item.className = item.className.replace(' selected', '');
			}
		}
	}

	// 必须结构为 : li > a
	exports.selectNav = function (hrefs){
		var a, href, selected_El;

		if(!hrefs || !hrefs.length)throw '导航条不存在！？';

		// 先遍历所有 a，看有没有 selected_El，如果没有，则是主页
		for(var i = 0, j = hrefs.length; i < j; i++){
			a = hrefs[i];
			href = a.getAttribute('href');
			// 去掉第一个 /\w+
			var arr = href.split('/');
			arr.shift();arr.shift();
			href = arr.join('/');
			
//			console.log(href);
			
			if(!href || href == '/')continue;
			else if(href != '.' /* 跳过首页 */ && location.href.indexOf(href) != -1){
				// debugger;
				selected_El = a;
				break;
			}
		}

		// 如果没有，则是主页
		if (selected_El)selected_El.parentNode.className += ' selected';
		else hrefs[0].parentNode.className += ' selected'; // 首页
	}
	
	try{
		var hrefs = document.querySelectorAll('nav.top ul li a');
		exports.selectNav(hrefs);
	}catch(e){
	}
});